local util = require("util.util")

local _M={
    code=0,
    status="200",
    msg=""
}
----继承时候调用------
function _M:new(yourCode,yourMsg,yourStatus)
    local child =  {code=yourCode,msg=yourMsg,status=yourStatus}  --新建继承者。 child 是实际继承者
    setmetatable(child,self) -- 对象 child 调用不存在的成员时都会去self中查找，而这里的self指的就是Object
    self.__index = self --
    return child
end
-------转json string--------
function _M:string()
    --print("exception string ")
    --return "{\"code\":"..self.code..",\"status\":"..self.status..',\"msg\":\""..msg.."\"}'
    return util.json(self);
end
--------错误堆栈打印-------
function _M:printStackTrace()

    if self ~=nil then
        --print("用冒号方式调用的printStackTrace")
        --print("error happen"..self:string())
        print("printStackTrace")
    end


end
--[[
传入的一个是要执行的函数
第二个是 捕捉函数
第三个是 业务函数的
]]--
-----------主要的 异常捕捉代码----------
function _M:try(process_func,catch_func,...)
    local arg={...}

    print("begin try ")


    local succFlag ,errObj= xpcall(
            process_func,
            catch_func,
            arg);
    if succFlag==false then
        ----print("统一异常后续处理")
        if errObj~= nil   then
            ---print("xpcall 返回的第二个参数 类型是"..type(errObj))
            if  type(errObj)=="table" then
               -- printTable(errObj,2);

            else if type(errObj)=="string" then
                ----print("xpcall 返回的第二个参数"..errObj)
            end
            end
        else
           --- print("xpcall 返回的第二个参数 是空")
        end

    end

end
-------异常抛出的代码----------
--function _M:throw(err )
--    if self == nil then
--        if child ~= nil then
--            print("判断是用点号访问的，抛出异常失败 ")
--            error(err,2)
--        end
--
--    else
--        if err == nil then
--            print("判断是用冒号访问的，开始抛出异常 ")
--            --error(self,2)  ---这里抛出的对象如果是复杂对象的话 抛出不了
--            error({ code=self.code,status=self.status,msg=self.msg },2)
--        else
--            error({ code=err.code or self.code,status=err.status or err.status,msg=child.msg or self.msg },2)
--        end
--    end
--
--    --error({ code=self.code,status=self.status,msg=self.msg },2)
--    --print("这里不会执行")
--end

---------异常抛出代码-----------

function _M:throwEx(err )
    if err ==nil then
        print("抛出的错误体错误");
        error(self,2);
    end
    if type(err) ~= "table" then
        print("抛出的错误体不是table");
        error(self,2);
        --return;
    end
    --local errorJson = {};
    if err.code == nil then
        err.code= self.code;

    end
    if self ~=nil then
        print("取到了self 值"..self.msg)
    end

    print("msg是空的" )
    if err.msg == nil then
        print("msg是空的"..self.msg)
        err.msg= self.msg;

    end
    if err.status == nil then
        err.status= self.status;

    end
    error(err,2)

end

------------写response ---------------
function _M.writeResponse(err )
    print("写放回消息 status:"..tostring(err.status).." msg:" .. err.msg);
    if err.status ~=200 then
        ngx.exit(err.status);
    else
        ngx.say(util:json(err));
    end
end

return _M;









